﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using System.Linq;
using System.Data.Linq;
using System.Data.Linq.Mapping;
using System.Reflection;
using System.Collections;

namespace UI_PMQLThuPhi_LMD
{
    public partial class frmSuDung : DevExpress.XtraEditors.XtraForm
    {
        DataClasses1DataContext dc = new DataClasses1DataContext();
        Cap_Phat cp;
        Chi_Tiet_Su_Dung ct;
        bool ChinhSua = true;

        public frmSuDung()
        {
            InitializeComponent();
        }

        private void frmSuDung_Load(object sender, EventArgs e)
        {
            var nvs = from nv in dc.Nhan_Viens select nv;
            cbbNhanVien.Properties.DataSource = nvs;
            cbbNhanVien.Properties.ValueMember = "NV_ID";
            cbbNhanVien.Properties.DisplayMember = "NV_MS";

            dNgaySD.EditValue = DateTime.Today;
            cbbNhanVien.EditValue = null;
            txtHoTen.Text = "";
            lbTuSo.Text = "";
            lbDenSo.Text = "";
            txtSLSuDung.Text = "";
            gcVeDangQuanLy.DataSource = null;

            txtSLSuDung.Enabled = false;
            txtSLMat.Enabled = false;
            txtSLHuy.Enabled = false;
            txtSLXoa.Enabled = false;

            txtSoMat.Enabled = false;
            txtSoXoa.Enabled = false;
            txtSoHuy.Enabled = false;

            btChinhSua.Enabled = false;
            btCapNhat.Enabled = false;

            groupControl1.Focus();
            cbbNhanVien.Focus();

            cp = new Cap_Phat();
            ct = new Chi_Tiet_Su_Dung();
        }

        //TEST
        #region
        private Boolean TestSoLuong()
        {
            bool rsSLSD = true;
            if (txtSLSuDung.Text == "" || txtSLSuDung.Text == "0")
            {
                rsSLSD = false;
                dxSLSuDung.SetError(txtSLSuDung, "Vui lòng nhập số lượng sử dụng");
            }
            else
            {
                rsSLSD = true;
                dxSLSuDung.ClearErrors();
            }
            return rsSLSD;
        }

        private Boolean TestSo()
        {
            bool rsMat = true;
            bool rsXoa = true;
            bool rsHuy = true;

            if (txtSLMat.Text != "" && txtSLMat.Text != "0" && txtSoMat.Text == "")
            {
                rsMat = false;
                dxSoMat.SetError(txtSoMat, "Vui lòng nhập số mất.");
            }
            else
            {
                rsMat = true;
                dxSoMat.ClearErrors();
            }

            if (txtSLXoa.Text != "" && txtSLXoa.Text != "0" && txtSoXoa.Text == "")
            {
                rsXoa = false;
                dxSoXoa.SetError(txtSoXoa, "Vui lòng nhập số xóa.");
            }
            else
            {
                rsXoa = true;
                dxSoXoa.ClearErrors();
            }

            if (txtSLHuy.Text != "" && txtSLHuy.Text != "0" && txtSoHuy.Text == "")
            {
                rsHuy = false;
                dxSoHuy.SetError(txtSoHuy, "Vui lòng nhập số xóa.");
            }
            else
            {
                rsHuy = true;
                dxSoHuy.ClearErrors();
            }

            return rsMat & rsHuy & rsXoa;
        }

        private Boolean TestTongSoSuDung()
        {
            bool rs = true;
            int slsd, slsdmax;
            int slmat, slxoa, slhuy;

            slsdmax = int.Parse(lbDenSo.Text) - int.Parse(lbTuSo.Text) + 1;
            slsd = int.Parse(txtSLSuDung.Text);
            #region region slmat
            if (txtSLMat.Text == "")
            {
                slmat = 0;
            }
            else
            {
                slmat = int.Parse(txtSLMat.Text);
            }
            #endregion

            #region region slxoa
            if (txtSLXoa.Text == "")
            {
                slxoa = 0;
            }
            else
            {
                slxoa = int.Parse(txtSLXoa.Text);
            }
            #endregion

            #region region huy
            if (txtSLHuy.Text == "")
            {
                slhuy = 0;
            }
            else
            {
                slhuy = int.Parse(txtSLHuy.Text);
            }
            #endregion

            if (slsdmax > slsd + slmat + slxoa + slhuy)
            {
                rs = true;
                dxSoLuong.ClearErrors();

            }
            else if (slsdmax == slsd + slmat + slxoa + slhuy)
            {
                rs = true;
                dxSoLuong.ClearErrors();
                cp.CP_HoanTra = true;
                string str = "Mẫu hóa đơn ..., ký hiệu..., từ số... đến số... đã sử dụng hết.";
                XtraMessageBox.Show(str, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                rs = false;
                dxSoLuong.SetError(txtSLSuDung, "Tổng số lượng sử dụng, xóa, mất, hủy vượt quá số lượng đã cấp phát.\nVui lòng kiểm tra lại số liệu.");
                dxSoLuong.SetError(txtSLXoa, "Tổng số lượng sử dụng, xóa, mất, hủy vượt quá số lượng đã cấp phát.\nVui lòng kiểm tra lại số liệu.");
                dxSoLuong.SetError(txtSLMat, "Tổng số lượng sử dụng, xóa, mất, hủy vượt quá số lượng đã cấp phát.\nVui lòng kiểm tra lại số liệu.");
                dxSoLuong.SetError(txtSLHuy, "Tổng số lượng sử dụng, xóa, mất, hủy vượt quá số lượng đã cấp phát.\nVui lòng kiểm tra lại số liệu.");
            }
            return rs;
        }
        #endregion

        //gvVeDangQuanLy_Load
        #region
        private void gvVeDangQuanLy_Load()
        {
            if (cbbNhanVien.EditValue != null)
            {
                int nvid = (int)cbbNhanVien.EditValue;
                Nhan_Vien nv = (from n in dc.Nhan_Viens where n.NV_ID == nvid select n).Single();
                txtHoTen.Text = nv.NV_Ten;

                var capphat = from p in dc.Cap_Phats
                              where p.NV_ID == nvid &&
                                  p.CP_HoanTra == false
                              select p;
                gcVeDangQuanLy.DataSource = capphat;
                gvVeDangQuanLy.FocusedRowHandle = 0;

                var mhds = from mhd in dc.Mau_Hoa_Dons select mhd;
                cbbMauHoaDon.Properties.DataSource = mhds;
                cbbMauHoaDon.Properties.ValueMember = "MHD_ID";
                cbbMauHoaDon.Properties.DisplayMember = "MHD_MauSo";
            }
        }

        private void cbbNhanVien_EditValueChanged(object sender, EventArgs e)
        {
            gvVeDangQuanLy_Load();
        }

        private void dNgaySD_EditValueChanged(object sender, EventArgs e)
        {
            gvVeDangQuanLy_Load();
        }
        #endregion

        private void gvVeDangQuanLy_GetRow(int i)
        {
            if (i >= 0)
            {
                int rowHandle = i;
                int id = Convert.ToInt32(gvVeDangQuanLy.GetRowCellValue(rowHandle, colCP_ID));

                //lỗi no elements - lúc có lúc không
                cp = dc.Cap_Phats.Single(c => c.CP_ID == id);

                lbTuSo.Text = cp.CP_TuSo.ToString();
                lbDenSo.Text = cp.CP_DenSo.ToString();

                List<Chi_Tiet_Su_Dung> ctsd = (from p in dc.Chi_Tiet_Su_Dungs
                                               where p.CTSD_Ngay == (DateTime)dNgaySD.EditValue &&
                                               p.Cap_Phat == cp
                                               select p).ToList();
                #region
                if (ctsd.Count > 0)
                {
                    ct = ctsd.First();
                    txtSLSuDung.Text = ct.CTSD_SL.ToString();
                    txtSLMat.Text = ct.CTSD_SLMat.ToString();
                    txtSLHuy.Text = ct.CTSD_SLHuy.ToString();
                    txtSLXoa.Text = ct.CTSD_SLXoa.ToString();

                    txtSoMat.Text = ct.CTSD_SoMat;
                    txtSoXoa.Text = ct.CTSD_SoXoa;
                    txtSoHuy.Text = ct.CTSD_SoHuy;

                    txtSLSuDung.Enabled = false;
                    txtSLMat.Enabled = false;
                    txtSLHuy.Enabled = false;
                    txtSLXoa.Enabled = false;

                    txtSoMat.Enabled = false;
                    txtSoXoa.Enabled = false;
                    txtSoHuy.Enabled = false;

                    btChinhSua.Enabled = true;
                    btChinhSua.Text = "Chỉnh sửa";
                    btCapNhat.Enabled = false;
                }
                else
                {
                    ct = new Chi_Tiet_Su_Dung();
                    txtSLSuDung.Text = "";
                    txtSLMat.Text = "";
                    txtSLHuy.Text = "";
                    txtSLXoa.Text = "";

                    txtSoMat.Text = "";
                    txtSoXoa.Text = "";
                    txtSoHuy.Text = "";

                    txtSLSuDung.Enabled = true;
                    txtSLMat.Enabled = true;
                    txtSLHuy.Enabled = true;
                    txtSLXoa.Enabled = true;

                    txtSoMat.Enabled = true;
                    txtSoXoa.Enabled = true;
                    txtSoHuy.Enabled = true;

                    btChinhSua.Enabled = false;
                    btChinhSua.Text = "Chỉnh sửa";
                    btCapNhat.Enabled = true;
                }
                #endregion
            }
        }

        private void gvVeDangQuanLy_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
        {
            int i = e.FocusedRowHandle;
            gvVeDangQuanLy_GetRow(i);
        }

        private void gvVeDangQuanLy_RowClick(object sender, DevExpress.XtraGrid.Views.Grid.RowClickEventArgs e)
        {
            int i = e.RowHandle;
            gvVeDangQuanLy_GetRow(i);
        }

        private void btCapNhat_Click(object sender, EventArgs e)
        {
            if (ct.CTSD_ID != 0)
            {
                XtraMessageBox.Show("Đã được cập nhật trong ngày.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {

                if (TestSoLuong() && TestSo())
                {
                    if (TestTongSoSuDung())
                    {
                        #region
                        //Update bảng CAP_PHAT
                        cp.CP_HoanTra = chkHoanTra.Checked;

                        try
                        {
                            dc.SubmitChanges();
                        }
                        catch (Exception)
                        {

                            throw;
                        }

                        //Insert bảng CHI_TIET_SU_DUNG
                        ct.Cap_Phat = cp;
                        ct.CTSD_Ngay = (DateTime)dNgaySD.EditValue;
                        ct.CTSD_SL = int.Parse(txtSLSuDung.Text);

                        if (txtSLHuy.Text != "")
                        {
                            ct.CTSD_SLHuy = int.Parse(txtSLHuy.Text);
                        }
                        if (txtSLMat.Text != "")
                        {
                            ct.CTSD_SLMat = int.Parse(txtSLMat.Text);
                        }

                        if (txtSLXoa.Text != "")
                        {
                            ct.CTSD_SLXoa = int.Parse(txtSLXoa.Text);
                        }
                        ct.CTSD_SoHuy = txtSoHuy.Text;
                        ct.CTSD_SoMat = txtSoMat.Text;
                        ct.CTSD_SoXoa = txtSoXoa.Text;

                        int rowHandle = gvVeDangQuanLy.GetSelectedRows().First();
                        dc.Chi_Tiet_Su_Dungs.InsertOnSubmit(ct);

                        try
                        {
                            dc.SubmitChanges();
                            dc.Refresh(RefreshMode.OverwriteCurrentValues, cp);

                            gvVeDangQuanLy_Load();

                            gvVeDangQuanLy.Focus();
                            if (gvVeDangQuanLy.RowCount > 0)
                            {
                                if (rowHandle == gvVeDangQuanLy.RowCount)
                                {
                                    gvVeDangQuanLy.FocusedRowHandle = rowHandle - 1;
                                    gvVeDangQuanLy_GetRow(rowHandle - 1);
                                }
                                else
                                {
                                    gvVeDangQuanLy.FocusedRowHandle = rowHandle;
                                    gvVeDangQuanLy_GetRow(rowHandle);
                                }
                            }
                            XtraMessageBox.Show("Cập nhật thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            
                        }
                        catch (Exception)
                        {
                            throw;
                        }
                        #endregion
                    }
                }

            }
        }

        private void btChinhSua_Click(object sender, EventArgs e)
        {
            if (ChinhSua == true)
            {
                #region
                btChinhSua.Text = "Lưu";
                btCapNhat.Enabled = false;
                ChinhSua = false;

                //enable txt
                txtSLSuDung.Enabled = true;
                txtSLMat.Enabled = true;
                txtSLHuy.Enabled = true;
                txtSLXoa.Enabled = true;

                txtSoMat.Enabled = true;
                txtSoXoa.Enabled = true;
                txtSoHuy.Enabled = true;

                txtSLSuDung.Focus();
                #endregion
            }
            else
            {
                #region
                if (TestSoLuong() && TestSo())
                {
                    if (TestTongSoSuDung())
                    {
                        //update
                        ct.Cap_Phat = cp;
                        ct.CTSD_Ngay = (DateTime)dNgaySD.EditValue;
                        ct.CTSD_SL = int.Parse(txtSLSuDung.Text);

                        if (txtSLHuy.Text != "")
                        {
                            ct.CTSD_SLHuy = int.Parse(txtSLHuy.Text);
                        }
                        if (txtSLMat.Text != "")
                        {
                            ct.CTSD_SLMat = int.Parse(txtSLMat.Text);
                        }

                        if (txtSLXoa.Text != "")
                        {
                            ct.CTSD_SLXoa = int.Parse(txtSLXoa.Text);
                        }
                        ct.CTSD_SoHuy = txtSoHuy.Text;
                        ct.CTSD_SoMat = txtSoMat.Text;
                        ct.CTSD_SoXoa = txtSoXoa.Text;

                        dc.SubmitChanges();
                        dc.Refresh(RefreshMode.OverwriteCurrentValues, cp);
                        gvVeDangQuanLy_Load();

                        ChinhSua = true;
                        btChinhSua.Text = "Chỉnh sửa";

                        txtSLSuDung.Enabled = false;
                        txtSLMat.Enabled = false;
                        txtSLHuy.Enabled = false;
                        txtSLXoa.Enabled = false;

                        txtSoMat.Enabled = false;
                        txtSoXoa.Enabled = false;
                        txtSoHuy.Enabled = false;

                        XtraMessageBox.Show("Cập nhật thành công.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                #endregion
            }
        }

        //LINH TINH
        #region
        private void gvVeDangQuanLy_RowStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowStyleEventArgs e)
        {
            if (e.RowHandle >= 0)
            {
                int id = Convert.ToInt32(gvVeDangQuanLy.GetRowCellValue(e.RowHandle, colCP_ID));
                Cap_Phat cp2 = new Cap_Phat();
                cp2 = dc.Cap_Phats.Single(c => c.CP_ID == id);

                List<Chi_Tiet_Su_Dung> ctsd2 = (from i in dc.Chi_Tiet_Su_Dungs
                                                where i.CTSD_Ngay == (DateTime)dNgaySD.EditValue &&
                                                i.Cap_Phat == cp2
                                                select i).ToList();
                if (ctsd2.Count > 0)
                //DateTime date = DateTime.Parse(gvVeDangQuanLy.GetRowCellValue(e.RowHandle, colNgayBaoCao).ToString());
                //if (date >= (DateTime)dNgaySD.EditValue)
                {
                    e.Appearance.BackColor = Color.DarkCyan;
                    e.Appearance.BackColor2 = Color.LightCyan;
                }
            }
        }

        private void btBoQua_Click(object sender, EventArgs e)
        {
            frmSuDung_Load(null, EventArgs.Empty);
            dxSLSuDung.ClearErrors();
            dxSoHuy.ClearErrors();
            dxSoLuong.ClearErrors();
            dxSoMat.ClearErrors();
            dxSoXoa.ClearErrors();
        }

        private void gvVeDangQuanLy_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e)
        {
            if (e.Column == colSTT)
            {
                if (e.RowHandle >= 0)
                {
                    e.DisplayText = (e.RowHandle + 1).ToString();
                }
            }
        }
        #endregion

        //Điều hướng
        #region
        private void cbbNhanVien_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)Keys.Enter)
            {
                gvVeDangQuanLy.Focus();
            }
        }

        private void gvVeDangQuanLy_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (ct.CTSD_ID != 0 )
                {
                    btChinhSua.Focus();
                }
                else
                {
                    txtSLSuDung.Focus();
                }
                
            }
        }

        private void txtSLSuDung_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                chkHoanTra.Focus();    
            }
        }

        private void chkHoanTra_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (ct.CTSD_ID != 0)
                {
                    btChinhSua.Focus();
                }
                else
                {
                    btCapNhat.Focus();
                }
            }
        }

        #endregion
    }
}